package com.okex.open.api.customize.enums;

import com.pig4cloud.pigx.common.customize.exception.MqNotAckException;
import com.pig4cloud.pigx.strategy.enums.StrategyStopOrderContractEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Objects;

/**
 * 欧易API接口参数枚举
 *
 * @since 2022/11/30 17:33
 */
public enum ApiOkxEnum {
    ;

    /**
     * 产品类型
     * <p>SPOT：币币
     * <p>MARGIN：币币杠杆
     * <p>SWAP：永续合约
     * <p>FUTURES：交割合约
     * <p>OPTION：期权）
     */
    @Getter
    @AllArgsConstructor
    public enum InstType {
        /**
         * SWAP 永续合约
         */
        SWAP("SWAP", "SWAP");


        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (InstType item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (InstType item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }

    /**
     * 方向（0做多、1做空）
     */
    @Getter
    @AllArgsConstructor
    public enum Side {
        /**
         * 0 做多
         */
        LONG("long", "0"),
        /**
         * 1 做空
         */
        SHORT("short", "1");

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (Side item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (Side item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }

    /**
     * 持仓模式（0逐仓、1全仓）
     */
    @Getter
    @AllArgsConstructor
    public enum PositionMode {
        /**
         * 0 逐仓
         */
        ISOLATED("isolated", "0"),
        /**
         * 1 全仓
         */
        CROSS("cross", "1");

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (PositionMode item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (PositionMode item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }

    /**
     * 操作类型（0买、1卖）,需要根据下单方向和操作类型设置值
     */
    @Getter
    @AllArgsConstructor
    public enum OperationType {
        /**
         * 0 买
         */
        BUY("buy", null),
        /**
         * 1 卖
         */
        SELL("sell", null);

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (OperationType item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (OperationType item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }

    /**
     * 类型（0市价单、1限价单）
     */
    @Getter
    @AllArgsConstructor
    public enum Type {
        /**
         * 0 市价单
         */
        MARKET("market", "0"),
        /**
         * 1 限价单
         */
        LIMIT("limit", "1");

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (Type item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (Type item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }

    /**
     * 订单状态
     * canceled：撤单成功
     * live：等待成交
     * partially_filled：部分成交
     * filled：完全成交
     */
    @Getter
    @AllArgsConstructor
    public enum OrderState {
        /**
         * canceled：撤单成功
         */
        CANCELED(null, "canceled"),
        /**
         * live：等待成交
         */
        LIVE(null, "live"),
        /**
         * partially_filled：部分成交
         */
        DEAL_PART(null, "partially_filled"),
        /**
         * filled：完全成交
         */
        DEAL(null, "filled");

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (OrderState item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (OrderState item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }

    /**
     * 策略订单类型
     * conditional：单向止盈止损
     * oco：双向止盈止损
     * trigger：计划委托
     * move_order_stop：移动止盈止损
     * iceberg：冰山委托
     * twap：时间加权委托
     *
     * @since 2023/2/8 09:55
     */
    @Getter
    @AllArgsConstructor
    public enum AlgoOrderType {
        /**
         * conditional：单向止盈止损
         */
        CONDITIONAL("conditional", null),
        /**
         * oco：双向止盈止损
         */
        OCO("oco", null),
        /**
         * trigger：计划委托
         */
        TRIGGER("trigger", null),
        /**
         * move_order_stop：移动止盈止损
         */
        MOVE_ORDER_STOP("move_order_stop", null),
        /**
         * iceberg：冰山委托
         */
        ICEBERG("iceberg", null),
        /**
         * twap：时间加权委托
         */
        TWAP("twap", null);

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (AlgoOrderType item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (AlgoOrderType item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }

        /**
         * 根据单向/双向获取对应的策略订单类型
         *
         * @param sideType 单向/双向（0单向、1双向）
         * @return {@link String}
         * @since 2023/2/8 10:11
         */
        public static String getBySideType(String sideType) {
            if (Objects.equals(StrategyStopOrderContractEnum.SideType.ONE_WAY.getValue(), sideType)) {
                return CONDITIONAL.getName();
            } else if (Objects.equals(StrategyStopOrderContractEnum.SideType.TWO_WAY.getValue(), sideType)) {
                return OCO.getName();
            } else {
                throw new MqNotAckException("未知的sideType值：" + sideType);
            }
        }
    }

    /**
     * 策略订单状态
     * effective： 已生效
     * canceled：已撤销
     * order_failed：委托失败
     *
     * @since 2023/2/8 09:55
     */
    @Getter
    @AllArgsConstructor
    public enum AlgoOrderState {
        /**
         * effective： 已生效
         */
        EFFECTIVE("effective", null),
        /**
         * canceled：已撤销
         */
        CANCELED("canceled", null),
        /**
         * order_failed：委托失败
         */
        ORDER_FAILED("order_failed", null);

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (AlgoOrderState item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (AlgoOrderState item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }

    /**
     * 策略订单实际触发方向
     * tp：止盈
     * sl：止损
     *
     * @since 2023/2/8 09:55
     */
    @Getter
    @AllArgsConstructor
    public enum AlgoOrderActualSide {
        /**
         * tp：止盈
         */
        PROFIT("tp", null),
        /**
         * sl：止损
         */
        LOST("sl", null);

        private final String name;
        private final String value;

        /**
         * 根据name查找对应value
         *
         * @param name 枚举名称
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findValue(String name) {
            for (AlgoOrderActualSide item : values()) {
                if (item.getName().equals(name)) {
                    return item.getValue();
                }
            }

            return null;
        }

        /**
         * 根据value查找对应的name
         *
         * @param value 枚举值
         * @return java.lang.String
         * @author gong_da_kai
         * @since 2021/11/14
         */
        public static String findName(String value) {
            for (AlgoOrderActualSide item : values()) {
                if (item.getValue().equals(value)) {
                    return item.getName();
                }
            }

            return null;
        }
    }
}
